package org.jpc.emulator.peripheral; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.SourceDataLine; /* * Handle the Music output, i.e. Midi Sound */ public class AudioLayer { static private byte[] audioBuffer; static public SourceDataLine line; static private boolean audioThreadExit = false; static private Thread audioThread; public static boolean open(int bufferSize, int freq) { AudioFormat format = new AudioFormat(freq, 16, 2, true, false); try { DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); line = (SourceDataLine) AudioSystem.getLine(info); line.open(format, bufferSize); line.start(); audioThreadExit = false; audioThread = new Thread() { public void run() { while (!audioThreadExit) { boolean result; synchronized (Mixer.audioMutex) { result = Mixer.MIXER_CallBack(audioBuffer, audioBuffer.length); } if (result) line.write(audioBuffer, 0, audioBuffer.length); else { try {Thread.sleep(20);} catch (Exception e){} } } } }; audioBuffer = new byte[512]; // this needs to be smaller than buffer size passed into open other line.write will block audioThread.start(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } public static void stop() { audioThreadExit = true; try {audioThread.join(2000);} catch (Exception e){} line.drain(); line.stop(); } }